/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DataAccessObject;

import BusinessEntity.BE_EstadoRequerimiento;
import BusinessEntity.BE_Personal;
import BusinessEntity.BE_Requerimiento;
import Comun.Conexion;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;

/**
 *
 * @author richard.saldana
 */
public class DA_Requerimiento {
    Conexion con;
    ResultSet rs;
    CallableStatement declaracion;

    private static DA_Requerimiento pinstancia=null;

    public static DA_Requerimiento obtenerInstancia()
    {
      if (pinstancia==null)
      {
          pinstancia=new DA_Requerimiento();
      }
      return pinstancia;
    }
    
     public ArrayList<BE_Requerimiento> obtenerRequerimientos(BE_Personal objBEPersonal) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        ArrayList<BE_Requerimiento> aobjBERequerimiento = new ArrayList<BE_Requerimiento>();      

        try {
            con.IniciarConexion();
            String strProcedure = "{call obtenerRequerimientos(?, ?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setInt(1, objBEPersonal.getObjBEUsuario().getIdUsuario());
            declaracion.setInt(2, objBEPersonal.getObjBERol().getIdRol());
            declaracion.execute();
            rs = declaracion.getResultSet();   

            
            while(rs.next()){
                BE_Requerimiento objBERequerimiento = new BE_Requerimiento();
                objBERequerimiento.setIdRequerimiento(rs.getInt("idRequerimiento"));
                objBERequerimiento.setStrNombre(rs.getString("nombre"));
                objBERequerimiento.setStrDescripcion(rs.getString("descripcion"));
                
                BE_EstadoRequerimiento objBEEstadoRequerimiento = new BE_EstadoRequerimiento();
                objBEEstadoRequerimiento.setIdEstado(rs.getInt("estado"));
                objBERequerimiento.setObjBEEstadoRequerimiento(objBEEstadoRequerimiento);
                
                objBERequerimiento.setIntFlagAsignacion(rs.getInt("flagAsignacion"));
                objBERequerimiento.setIntPrioridad(rs.getInt("prioridad"));
                objBERequerimiento.setIntUsuarioAsignado(rs.getInt("usuarioAsignado"));
                
                
                aobjBERequerimiento.add(objBERequerimiento);
            }

   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            
            con.CerrarConexion();
 
            
        }
        
        return aobjBERequerimiento;
      
}
     
    public ArrayList<BE_Requerimiento> obtenerRequerimientosBusqueda(BE_Personal objBEPersonal, BE_Requerimiento objBE_Requerimiento) throws InstantiationException, IllegalAccessException, SQLException{

            con = Conexion.ObtenerInstancia();
            ArrayList<BE_Requerimiento> aobjBERequerimiento = new ArrayList<BE_Requerimiento>();      

            try {
                con.IniciarConexion();
                String strProcedure = "{call obtenerRequerimientosBusqueda(?, ?, ?, ?, ?) }";
                declaracion = con.preparaLlamada(strProcedure);
                declaracion.setInt(1, objBEPersonal.getObjBEUsuario().getIdUsuario());
                declaracion.setInt(2, objBEPersonal.getObjBERol().getIdRol());
                if(objBE_Requerimiento.getStrNombre() == null){      
                 declaracion.setString(3, "Todos");   
                }else{
                 declaracion.setString(3, objBE_Requerimiento.getStrNombre());
                }
                 declaracion.setInt(4, objBE_Requerimiento.getIdRequerimiento());
               
                if(objBE_Requerimiento.getObjBEEstadoRequerimiento() == null){
                 declaracion.setInt(5, 0);   
                }else{
                 declaracion.setInt(5, objBE_Requerimiento.getObjBEEstadoRequerimiento().getIdEstado());
                }
                           
                declaracion.execute();
                rs = declaracion.getResultSet();   


                while(rs.next()){
                    BE_Requerimiento objBERequerimiento = new BE_Requerimiento();
                    objBERequerimiento.setIdRequerimiento(rs.getInt("idRequerimiento"));
                    objBERequerimiento.setStrNombre(rs.getString("nombre"));
                    objBERequerimiento.setStrDescripcion(rs.getString("descripcion"));

                    BE_EstadoRequerimiento objBEEstadoRequerimiento = new BE_EstadoRequerimiento();
                    objBEEstadoRequerimiento.setIdEstado(rs.getInt("estado"));

                    objBERequerimiento.setIntFlagAsignacion(rs.getInt("flagAsignacion"));

                    objBERequerimiento.setObjBEEstadoRequerimiento(objBEEstadoRequerimiento);
                    aobjBERequerimiento.add(objBERequerimiento);
                }


            } catch (SQLException exception) {
                System.out.println("error: " + exception.getMessage());
                exception.printStackTrace();
            } finally {

                con.CerrarConexion();


            }

            return aobjBERequerimiento;
      
        }
     
       public void registrarRequerimiento(BE_Requerimiento objRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        
        try {
            con.IniciarConexion();
            String strProcedure = "{call registrarRequerimiento(?,?,?,?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setString(1, objRequerimiento.getStrNombre());
            declaracion.setString(2, objRequerimiento.getStrDescripcion());
            declaracion.setInt(3, objRequerimiento.getIntPrioridad());
            declaracion.setInt(4, objRequerimiento.getObjBEUsuario().getIdUsuario());
            declaracion.execute();
            
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            con.CerrarConexion();
    
        }

      
}
       
        public void ejecutarRequerimiento(int intCodigoRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        
        try {
            con.IniciarConexion();
            String strProcedure = "{call ejecutarRequerimiento(?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setInt(1, intCodigoRequerimiento);
            declaracion.execute();
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            
            con.CerrarConexion();
 
            
        }

      
}
        
        public boolean verificacionrequerimientos(int intIdRol, int intIdUsuario) throws InstantiationException, IllegalAccessException{
            con = Conexion.ObtenerInstancia();
            int numero = 0;
        
        try {
            con.IniciarConexion();
            String strProcedure = "{? = call validacionRequerimientos(?, ?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.registerOutParameter(1, Types.INTEGER);
            declaracion.setInt(2, intIdRol);
            declaracion.setInt(3, intIdUsuario);
            declaracion.execute();
            numero = declaracion.getInt(1);
            
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            
            con.CerrarConexion();
 
            
        }
        return (numero != 0);
        }
        
        
       public BE_Requerimiento obtenerRequerimientoID(int intCodigoRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{
        con = Conexion.ObtenerInstancia();
        BE_Requerimiento objBE_Requerimiento = new BE_Requerimiento();
        ArrayList<BE_Requerimiento> aobjBERequerimiento = new ArrayList<BE_Requerimiento>();

        try {
            con.IniciarConexion();
            String strProcedure = "{call obtenerRequerimientoID(?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setInt(1, intCodigoRequerimiento);
            declaracion.execute();
            rs = declaracion.getResultSet();   
            
            while(rs.next()){
                BE_Requerimiento objBERequerimiento = new BE_Requerimiento();
                objBERequerimiento.setIdRequerimiento(rs.getInt("idRequerimiento"));
                objBERequerimiento.setStrNombre(rs.getString("nombre"));
                objBERequerimiento.setStrDescripcion(rs.getString("descripcion"));
                
                BE_EstadoRequerimiento objBEEstadoRequerimiento = new BE_EstadoRequerimiento();
                objBEEstadoRequerimiento.setIdEstado(rs.getInt("estado"));

                objBERequerimiento.setObjBEEstadoRequerimiento(objBEEstadoRequerimiento);
                objBERequerimiento.setIntUsuarioAsignado(rs.getInt("usuarioAsignado"));
                
                objBERequerimiento.setIntPrioridad(rs.getInt("prioridad"));
                
                aobjBERequerimiento.add(objBERequerimiento);
            }
            
            if(aobjBERequerimiento != null){
                objBE_Requerimiento = aobjBERequerimiento.get(0);
            }
            
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            
            con.CerrarConexion();
 
            
        }
        
        return objBE_Requerimiento;
      
}
       
              public void asignarRequerimiento(BE_Requerimiento objRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        
        try {
            con.IniciarConexion();
            String strProcedure = "{call asignarRequerimiento(?, ?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setInt(1, objRequerimiento.getIdRequerimiento());
            declaracion.setInt(2, objRequerimiento.getIntUsuarioAsignado());
            declaracion.execute();
            
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            con.CerrarConexion();
    
        }

      
}
              
        public void eliminarRequerimiento(int intCodigoRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        
        try {
            con.IniciarConexion();
            String strProcedure = "{call eliminarRequerimiento(?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setInt(1, intCodigoRequerimiento);
            declaracion.execute();
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            
            con.CerrarConexion();
 
            
        }

      
}
        
               public void modificarRequerimiento(BE_Requerimiento objRequerimiento) throws InstantiationException, IllegalAccessException, SQLException{

        con = Conexion.ObtenerInstancia();
        
        try {
            con.IniciarConexion();
            String strProcedure = "{call modificarRequerimiento(?,?,?,?) }";
            declaracion = con.preparaLlamada(strProcedure);
            declaracion.setString(1, objRequerimiento.getStrNombre());
            declaracion.setString(2, objRequerimiento.getStrDescripcion());
            declaracion.setInt(3, objRequerimiento.getIntPrioridad());
            declaracion.setInt(4, objRequerimiento.getIdRequerimiento());
            declaracion.execute();
            
   
        } catch (SQLException exception) {
            System.out.println("error: " + exception.getMessage());
            exception.printStackTrace();
        } finally {
            con.CerrarConexion();
    
        }

      
}
}
